#include<iostream>
#include<string>
#include<vector>
using namespace std;
//画线理解公共前后缀，直接回退j就可以
string p,s;
vector<int>ne;
void init_ne(){
    //j不会超过i导致不会死循环
    //j==0 表示不能继续回退 因为没有ne[-1]
    //ne 存长度 j=ne[j-1]刚好就是要匹配的位置
    int j=0;
    //遍历一遍
    for(int i=1;i<ne.size();)
        //相等更新长度
        if(p[i]==p[j])
            ne[i++]=++j;
        //不相等回退j(KMP原理 其实就是比较0~j,i-j~i)，退不了就0
        //不相等的话不加i，当前i跟回退后的j比较
        else
            j?j=ne[j-1]:ne[i++]=0;
}

int main(){
    int n,m;
    cin>>n>>p>>m>>s;
    ne.resize(n,0);
    init_ne();
    int j=0;
    int i=0;
    while(i<s.size()){
        if(s[i]==p[j]){
            i++,j++;
            if(j==p.size()){
                cout<<i-j<<' ';
                j=ne[j-1];
            }
        }
        else{//当前i跟回退后的j比较 或者 失败i++
            j?j=ne[j-1]:i++;
        }
    }
    return 0;
    
}